شرح دورة أساسيات Dart

Dart هي لغة برمجة قوية طورتها Google، وهي اللغة الأساسية لتطوير تطبيقات Flutter. إذا كنت تريد تعلم Dart، فإليك دليلك الشامل من الأساسيات إلى الميزات المتقدمة! 💡

الدرس الأول: أساسيات Dart

Dart هي لغة برمجة قوية طورتها Google، وهي اللغة الأساسية لتطوير تطبيقات Flutter. إذا كنت تريد تعلم Dart، فإليك دليلك الشامل من الأساسيات إلى الميزات المتقدمة! 💡

شرح مفصل:
  • مقدمة عن Dart: Dart هي لغة كائنية التوجه (Object-Oriented). تدعم البرمجة الوظيفية والإجرائية. تستخدم في تطوير تطبيقات الويب والموبايل وسطح المكتب. تتميز بالأداء العالي وسهولة التعلم.
  • أساسيات Dart: طباعة النصوص، المتغيرات، والتحكم في تدفق البرنامج.
مثال:
void main() { print("مرحبًا بك في Dart!"); }
void main() { int age = 18; if (age >= 18) { print("يمكنك التصويت!"); } else { print("لا يمكنك التصويت بعد."); } }

الدرس الثاني: المحددات في Dart

المحددات (Modifiers) هي كلمات مفتاحية تُستخدم في Dart للتحكم في الوصول إلى المتغيرات، الدوال، الكلاسات، والمكتبات. هناك أنواع مختلفة من المحددات التي تؤثر على الرؤية (Visibility)، التعديل (Mutability)، وسلوك الكود.

شرح مفصل:
  • محددات الوصول: في Dart، لا توجد كلمات مفتاحية صريحة مثل public, private, protected كما هو الحال في Java أو C#. بدلاً من ذلك، تعتمد Dart على نظام التسمية باستخدام _ (Underscore) لتحديد الكود الخاص.
  • محددات الثبات والتغيير: تحدد هذه المحددات إمكانية تغيير القيم بعد تعريفها.
مثال:
class Person { String name; // متغير عام (Public) int _age; // متغير خاص (Private) Person(this.name, this._age); void display() { print("الاسم: $name، العمر: $_age"); } } void main() { Person person = Person("أحمد", 25); print(person.name); // ✅ يمكن الوصول إليه // print(person._age); ❌ خطأ لأنه خاص person.display(); // ✅ يمكن الوصول إليه }
void main() { final String name = "أحمد"; // ثابت يمكن تعيينه مرة واحدة const double pi = 3.14; // ثابت لا يمكن تغييره أبدًا // name = "علي"; // ❌ خطأ: لا يمكن إعادة تعيين قيمة `final` // pi = 3.1415; // ❌ خطأ: لا يمكن إعادة تعيين قيمة `const` }

الدرس الثالث: التصفح في Dart

التصفح في Dart يتم استخدامه بشكل أساسي عند تطوير تطبيقات الويب أو الموبايل باستخدام Flutter. هناك عدة طرق للتنقل بين الصفحات وإدارة مسار التطبيق، وسنغطيها بالتفصيل.

شرح مفصل:
  • التصفح في تطبيقات CLI: إذا كنت تعمل على تطبيق Dart بدون واجهة رسومية (مثل تطبيق سطر الأوامر - CLI)، يمكنك استخدام dart:io لمعالجة إدخال المستخدم والتنقل بين الخيارات.
  • التصفح في تطبيقات الويب باستخدام Dart: عند استخدام Dart لتطوير تطبيقات الويب (مثل Dart with Flutter Web)، يمكننا استخدام dart:html أو Router لإدارة التصفح.
  • التصفح في Flutter باستخدام Navigator: في Flutter، يتم التنقل بين الشاشات (الصفحات) باستخدام Navigator الذي يعمل مع MaterialApp و routes.
مثال:
import 'dart:io'; void main() { while (true) { print("اختر خيارًا:"); print("1. عرض الصفحة الرئيسية"); print("2. عرض الإعدادات"); print("3. خروج"); String? choice = stdin.readLineSync(); switch (choice) { case "1": print("📌 أنت في الصفحة الرئيسية"); break; case "2": print("⚙️ أنت في صفحة الإعدادات"); break; case "3": print("👋 وداعًا!"); exit(0); default: print("❌ خيار غير صحيح، حاول مرة أخرى."); } } }
import 'dart:html'; void main() { querySelector('#home')?.onClick.listen((_) { window.location.href = 'home.html'; }); querySelector('#settings')?.onClick.listen((_) { window.location.href = 'settings.html'; }); }
import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( home: HomePage(), )); } class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("الصفحة الرئيسية")), body: Center( child: ElevatedButton( onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (context) => SettingsPage()), ); }, child: Text("الانتقال إلى الإعدادات"), ), ), ); } } class SettingsPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("الإعدادات")), body: Center( child: ElevatedButton( onPressed: () { Navigator.pop(context); }, child: Text("العودة"), ), ), ); } }

الدرس الرابع: الأنماط المتقدمة

في هذا الدرس، سنغطي أنماط البرمجة الكائنية (OOP)، البرمجة الوظيفية (Functional Programming)، المزج (Mixins)، البرمجة التفاعلية (Reactive Programming)، والتنفيذ المتزامن (Asynchronous Programming).

شرح مفصل:
  • الأنماط الكائنية: Dart لغة كائنية التوجه (OOP)، مما يعني أنها تعتمد على الكلاسات (Classes) والكائنات (Objects).
  • البرمجة الوظيفية: Dart تدعم البرمجة الوظيفية من خلال الدوال عالية الترتيب (Higher-Order Functions)، التعبيرات اللامية (Lambdas)، والمعادلة (Immutability).
مثال:
class Animal { String name; Animal(this.name); void makeSound() { print("الحيوان يصدر صوتًا!"); } } class Dog extends Animal { Dog(String name) : super(name); @override void makeSound() { print("$name ينبح: Woof! Woof!"); } } void main() { Dog dog = Dog("Buddy"); dog.makeSound(); // ✅ Buddy ينبح: Woof! Woof! }
void applyFunction(Function(int) func, int value) { print("النتيجة: ${func(value)}"); } int square(int x) => x * x; void main() { applyFunction(square, 4); // ✅ النتيجة: 16 }

الدرس الخامس: التعامل مع الملفات

Dart توفر أدوات قوية للتعامل مع الملفات، مما يسمح بقراءة وكتابة الملفات بسهولة.

شرح مفصل:
  • قراءة الملفات: يمكن قراءة محتوى الملف باستخدام `File.readAsString`.
  • كتابة الملفات: يمكن كتابة محتوى إلى ملف باستخدام `File.writeAsString`.
مثال:
import 'dart:io'; void main() async { final file = File('example.txt'); String content = await file.readAsString(); print(content); }
import 'dart:io'; void main() async { final file = File('example.txt'); await file.writeAsString('Hello, Dart!'); }

الدرس السادس: الجمل الشرطية والحلقات

الجمل الشرطية والحلقات هي أدوات أساسية في البرمجة تسمح باتخاذ القرارات وتكرار العمليات.

شرح مفصل:
  • الجمل الشرطية: مثل `if`، `else`، و `else if`.
  • الحلقات: مثل `for`، `while`، و `do-while`.
مثال:
void main() { int age = 18; if (age >= 18) { print("أنت بالغ."); } else { print("أنت قاصر."); } }
void main() { for (int i = 0; i < 5; i++) { print("الرقم: $i"); } }

الدرس السابع: الدوال (Functions)

الدوال هي كتل من الكود يمكن استدعاؤها لتنفيذ مهمة محددة. تساعد في تنظيم الكود وإعادة استخدامه.

شرح مفصل:
  • تعريف الدوال: يتم تعريف الدوال باستخدام `void` أو نوع القيمة المرجعة.
  • استدعاء الدوال: يمكن استدعاء الدوال باستخدام اسمها.
مثال:
void greet(String name) { print("مرحبًا، $name!"); } void main() { greet("علي"); // ✅ مرحبًا، علي! }

الدرس الثامن: المصفوفات (Arrays)

المصفوفات هي هياكل بيانات تخزن مجموعة من العناصر في ترتيب معين. يمكن الوصول إلى العناصر باستخدام الفهرس.

شرح مفصل:
  • إنشاء المصفوفات: يتم إنشاء المصفوفات باستخدام الأقواس المربعة `[]`.
  • الوصول إلى العناصر: يمكن الوصول إلى العناصر باستخدام الفهرس.
مثال:
void main() { List numbers = [1, 2, 3, 4, 5]; print(numbers[0]); // ✅ 1 }

الدرس التاسع: الهاش (Hashes)

الهاش هو هيكل بيانات يخزن البيانات في أزواج مفتاح-قيمة. يمكن استخدامه لتخزين البيانات المرتبطة.

شرح مفصل:
  • إنشاء الهاش: يتم إنشاء الهاش باستخدام الأقواس المعقوفة `{}`.
  • الوصول إلى القيم: يمكن الوصول إلى القيم باستخدام المفتاح.
مثال:
void main() { Map person = { 'name': 'علي', 'age': '25' }; print(person['name']); // ✅ علي }

الدرس العاشر: الاستثناءات (Exceptions)

الاستثناءات هي أخطاء تحدث أثناء تنفيذ البرنامج. يمكن التعامل معها باستخدام `try`، `catch`، و `finally`.

شرح مفصل:
  • التعامل مع الاستثناءات: يتم استخدام `try` و `catch` للتعامل مع الأخطاء.
  • الكود النهائي: يتم استخدام `finally` لتنفيذ كود بغض النظر عن حدوث استثناء أم لا.
مثال:
void main() { try { int result = 10 ~/ 0; } catch (e) { print("حدث خطأ: $e"); } finally { print("هذا الكود سيتم تنفيذه دائمًا."); } }